package Day18.Inner06;

/**
 * @author HYHwtx
 * @version 1.0
 * @date 2022/2/25 17:45
 */
/**
 * 成员内部类
 * 说明：成员内部类是定义在外部类的成员位置，并且没有static修饰
 */
public class NumberInnerClass {
    public static void main(String[] args) {
        Outer08 outer08 = new Outer08();
        outer08.t1();
        //外部其他类,使用成员内部类的三种形式
        //第一种
//        outer08.new Inner08();/*相当于把new Inner08()；当做outer08的成员*/
        //就是一个语法
        Outer08.Inner08 inner08 = outer08.new Inner08();
        inner08.say();
        //第二种 在外部类中编写了一个方法，可以返回Inner08的对象
        Outer08.Inner08 inner081 = outer08.getInner08Instance();
        inner081.say();
    }
}

//1.注意：成员内部类是定义在外部类的成员位置，并且没有static修饰
//2.可以直接访问外部类的所有成员，包含私有的
//3.可以添加任意访问修饰符（public protected 默认 private）,因为他的地位是一位成员
//4.作用域：和其他成员的外部类一样，为这个类体，比如前面的案例，在外部类中的成员方法中创建成员内部类对象，然后在进行调用
//5.成员内部类---访问---外部类成员（比如：属性）[访问方式：直接访问]
//6.外部其他类---访问----成员内部类
//7.如果外部类和内部类的成员重名的时候，内部类访问的话，默认遵循就近原则，如果想要访问外部类的成员，则可以使用（外部类名.this.成员）去访问
class Outer08 {
    private int n1 = 10;
    private String name = "张三";

    //可以添加任意访问修饰符（public protected 默认 private),因为他的地位是一位成员
    class Inner08 {//成员内部类
        private double sal = 99.9;
        private int n1 = 44;

        public void say() {
            //可以直接访问外部类的所有成员，包括私有的
            System.out.println("Outer08的n1=" + n1 + "Outer 08 name:" + name);
            System.out.println("n1:" + n1 + "name:" + name + "外部类的n1=" + Outer08.this.n1);

        }
    }

    //方法，返回一个Inner08实例
    public  Inner08 getInner08Instance() {
        return new Inner08();

    }

    public void t1() {
        //使用成员内部类
        Inner08 inner08 = new Inner08();
        inner08.say();
        System.out.println(inner08.sal);
    }
}